#include_function".\src\lib_Reimu.txt"

//0.275
//10
//3,3,4,6,6,4,3,3
let DMG_MAINSHOT=2.75;
let DMG_SUBSHOT=[0.825, 0.825, 1.1, 1.65, 1.65, 1.1, 0.825, 0.825];

sub onInitialize_ReimuB{
	onInitialize_Reimu;
	LoadPlayerShotData(csd~"src\data_playershot_rb.txt");
}



task Main{
	yield;
	MainShotFire;
	Options;
	BombEffect;
	th10_System;
}



task Options{
	let posx=[-32,-16,16,32];
	let posy=[0,-32,-32,0];
	let gang=0;
	let fire=false;
	let cenx=GetPlayerX;
	let ceny=GetPlayerY;
	let scalex=1;
	let scaley=1;
	let dscale=0.05;
	let alpha=255;
	let dalpha=16;
	
	Move;
	CreateOptions;
	SlowMove;
	ShotControl;
	VanishControl;
	Rotate;
	
	
	function CreateOptions{
		ascent(n in 0..4){Option(n);}
	}
	
	
	task Move{
		let ang;
		let distance;
		loop{
			if(OnMissed && !OnBorderOfLife){
				while(OnMissed){yield;}
				cenx=GetPlayerX;
				ceny=GetPlayerY;
			}else{
				ang=atan2(GetPlayerY-ceny,GetPlayerX-cenx);
				distance=((GetPlayerX-cenx)^2+(GetPlayerY-ceny)^2)^0.5;
				distance*=0.5;
				if(distance<1){
					cenx=GetPlayerX;
					ceny=GetPlayerY;
				}else{
					cenx+=distance*cos(ang);
					ceny+=distance*sin(ang);
				}
			}
			yield;
		}
	}
	
	
	task SlowMove{
		let slowx03=[32,24,20,18,17,16.5,16.25,16];
		let slowx12=[16,12,10,9,8.5,8.25,8.125,8];
		let slowy=[0,-10,-15,-17.5,-18.75,-19.375,-19.7625,-20];
		let fastx03=[32,31.75,31.5,31,30,28,24,16];
		let fastx12=[16,15.875,15.75,15.5,15,14,12,8];
		let fasty=[0,-0.3125,-0.625,-1.25,-2.5,-5,-10,-20];
		let n=0;
		
		loop{
			if(!OnMissed || OnBorderOfLife){
				if(GetKeyState(VK_SLOWMOVE)){
					if(n<8){
						posx[0]=-slowx03[n];
						posy[0]=slowy[n];
						posx[1]=-slowx12[n];
						posx[2]=slowx12[n];
						posx[3]=slowx03[n];
						posy[3]=slowy[n];
						n++;
					}
				}else{
					if(n>0){
						n--;
						posx[0]=-fastx03[n];
						posy[0]=fasty[n];
						posx[1]=-fastx12[n];
						posx[2]=fastx12[n];
						posx[3]=fastx03[n];
						posy[3]=fasty[n];
					}
				}
			}
			yield;
		}
	}
	
	
	task ShotControl{
		let c=0;
		loop{
			if((GetKeyState(VK_SHOT)==KEY_PUSH)||(GetKeyState(VK_SHOT)==KEY_HOLD)){
				c=6;
			}
			
			if(c>0){
				fire=true;
				c--;
				yield;
				fire=false;
				yield;
			}
			yield;
		}
	}
	
	
	task VanishControl{
		loop{
			if(OnMissed && !OnBorderOfLife){
				if(scalex>0){
					scalex-=dscale;
					scaley+=dscale;
				}
				if(alpha>0){
					alpha-=dalpha;
				}
			}else{
				scalex=1;
				scaley=1;
				alpha=255;
			}
			yield;
		}
	}
	
	
	task Rotate{
		loop{
			gang+=6;
			gang%=360;
			yield;
		}
	}
	
	
	task Option(num){
		let obje=Obj_Create(OBJ_EFFECT);
		let obj=Obj_Create(OBJ_EFFECT);
		
		let timer=10800;
		
		ObjEffect_SetTexture(obj,IMG_OPTION);
		ObjEffect_SetLayer(obj,2);
		ObjEffect_SetPrimitiveType(obj,PRIMITIVE_TRIANGLESTRIP);
		ObjEffect_CreateVertex(obj,4);
		ObjEffect_SetVertexUV(obj,0,16,0);
		ObjEffect_SetVertexUV(obj,1,16,16);
		ObjEffect_SetVertexUV(obj,2,32,0);
		ObjEffect_SetVertexUV(obj,3,32,16);
		ObjEffect_SetVertexXY(obj,0,-7,-7);
		ObjEffect_SetVertexXY(obj,1,-7,8);
		ObjEffect_SetVertexXY(obj,2,8,-7);
		ObjEffect_SetVertexXY(obj,3,8,8);
		
		ObjEffect_SetTexture(obje,IMG_OPTION);
		ObjEffect_SetLayer(obje,2);
		ObjEffect_SetRenderState(obje,ALPHA);
		ObjEffect_SetPrimitiveType(obje,PRIMITIVE_TRIANGLESTRIP);
		ObjEffect_CreateVertex(obje,4);
		ObjEffect_SetVertexUV(obje,0,16,16);
		ObjEffect_SetVertexUV(obje,1,16,32);
		ObjEffect_SetVertexUV(obje,2,32,16);
		ObjEffect_SetVertexUV(obje,3,32,32);
		ObjEffect_SetVertexXY(obje,0,-10.5,-10.5);
		ObjEffect_SetVertexXY(obje,1,-10.5,11.5);
		ObjEffect_SetVertexXY(obje,2,11.5,-10.5);
		ObjEffect_SetVertexXY(obje,3,11.5,11.5);
		
		while(!Obj_BeDeleted(obj)){
			if(OnMissed && !OnBorderOfLife){
				ObjEffect_SetRenderState(obj,ADD);
			}else{
				ObjEffect_SetRenderState(obj,ALPHA);
			}
			ObjEffect_SetScale(obj,scalex,scaley);
			ascent(n in 0..4){ObjEffect_SetVertexColor(obje,n,alpha,255,255,255);}
			
			Obj_SetPosition(obj,cenx+posx[num],ceny+posy[num]);
			Obj_SetPosition(obje,cenx+posx[num],ceny+posy[num]);
			
			if(!OnMissed && !OnEvent){
				if(fire){
					ascent(i in 0..2){
						SubShot(Obj_GetX(obj)+8*cos(i*180),Obj_GetY(obj),DMG_SUBSHOT[num*2+i]);
					}
				}
			}
			
			ObjEffect_SetAngle(obj,0,0,gang);
			ObjEffect_SetAngle(obje,0,0,-gang-90);
			
			timer--;
			
			if(timer==0){
				Option(num);
				Obj_Delete(obj);
				Obj_Delete(obje);
				return;
			}
			yield;
		}
	}
	
	
	task SubShot(x,y,dmg){
		let obj=Obj_Create(OBJ_SHOT);
		let alpha=128;
		let dalpha=8;
		let sizex=3;
		let dx=0.1875;
		let sizey=32;
		let dy=26;
		let flg=false;
		Obj_SetPosition(obj,x,y);
		Obj_SetSpeed(obj,28);
		Obj_SetAngle(obj,270);
		ObjShot_SetGraphic(obj,2);
		ObjShot_SetDamage(obj,dmg);
		ObjShot_SetPenetration(obj,1);
		
		let obje=Obj_Create(OBJ_EFFECT);
		ObjEffect_SetTexture(obje,IMG_SHOT);
		ObjEffect_SetPrimitiveType(obje,PRIMITIVE_TRIANGLESTRIP);
		ObjEffect_SetLayer(obje,2);
		ObjEffect_CreateVertex(obje,4);
		ObjEffect_SetVertexUV(obje,0,33,0);
		ObjEffect_SetVertexUV(obje,1,33,64);
		ObjEffect_SetVertexUV(obje,2,39,0);
		ObjEffect_SetVertexUV(obje,3,39,64);
		ObjEffect_SetVertexXY(obje,0,-3,-32);
		ObjEffect_SetVertexXY(obje,1,-3,32);
		ObjEffect_SetVertexXY(obje,2,3,-32);
		ObjEffect_SetVertexXY(obje,3,3,32);
		while(!Obj_BeDeleted(obj)){
			Obj_SetPosition(obje,Obj_GetX(obj),Obj_GetY(obj));
			flg=Obj_IsIntersected(obj);
			yield;
		}
		
		if(!flg){
			Obj_Delete(obje);
			return;
		}
		
		ObjEffect_SetRenderState(obje,ADD);
		loop(16){
			ascent(n in 0..4){ObjEffect_SetVertexColor(obje,n,alpha,255,255,255);}
			alpha-=dalpha;
			sizex-=dx;
			sizey+=dy;
			ObjEffect_SetVertexXY(obje,0,-sizex,-sizey);
			ObjEffect_SetVertexXY(obje,1,-sizex,sizey);
			ObjEffect_SetVertexXY(obje,2,sizex,-sizey);
			ObjEffect_SetVertexXY(obje,3,sizex,sizey);
			yield;
		}
		Obj_Delete(obje);
	}
}